<?php
namespace App\Common\Lib\Err;

use App\Common as com;

class GetBack extends com\Lib\LibBase {
	public static $isRecordCourse = 1; // 是否记录过程信息（最终决定是否输出的配置在"app_debug"）
	protected static $courseData = []; // 过程数据 
	
	/** @TODO : 错误日志记录 */
	// protected static $errLog = [];
	/** @TODO :  是否记录错误 */
	// protected static $isRecordErr = 0;
	
	/**
	 * 取过程数据
	 * @return array 过程数据
	 */
	public static function getCourseData(){
		return self::$courseData;
	}
	
	/**
	 * 记录过程
	 * @param array $errorInfo 错误信息
	 * @return mixed $error 原样返回参数
	 */
	public static function recordCourse( $errorInfo, $debug_backtrace_index = 1 ){
		if( self::$isRecordCourse != 1 ) return;
		// if( ! \think\Config::get('debug.record_course') ) return;
		$debug_backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, $debug_backtrace_index + 1 );
		//
		$current_course_data = [
			'info' => $errorInfo,
			'__file__' => $debug_backtrace[ $debug_backtrace_index ]['file'] ?? '-',
			'__line__' => $debug_backtrace[ $debug_backtrace_index ]['line'] ?? '-',
		];
		//
		array_unshift( self::$courseData, $current_course_data );
	}
	
	/**
	 * 上报错误(错误返回中间件)
	 * @param null|int $error 错误码
	 * @param string $errorStr 错误的说明
	 * @param string $errorLevel 错误级别（默认为：notic） [serious]严重 [warning]警告 [notic]提醒
	 * @return mixed $error 原样返回参数
	 */
	protected static function main( int $error, string $errorStr = '', $errorLevel = 'notic' ){
		self::recordCourse( [
			'code' => $error,
			'codeStr' => $errorStr,
			'level' => $errorLevel,
		], 2 );
		return $error;
	}
	
	/**
	 * 上报错误，级别：严重(错误返回中间件)
	 * @param null|int $error 错误码
	 * @param mixed $error_str 错误的说明
	 * @return mixed $error 原样返回参数
	 */
	public static function serious( int $error, string $error_str = '' ){
		return self::main( $error, $error_str, 'serious' );
	}
	
	/**
	 * 上报错误，级别：警告(错误返回中间件)
	 * @param null|int $error 错误码
	 * @param mixed $error_str 错误的说明
	 * @return mixed $error 原样返回参数
	 */
	public static function warning( int $error, string $error_str = '' ){
		return self::main( $error, $error_str, 'warning' );
		
	}
	
	/**
	 * 上报错误，级别：提醒(错误返回中间件)
	 * @param null|int $error 错误码
	 * @param mixed $error_str 错误的说明
	 * @return mixed $error 原样返回参数
	 */
	public static function notic( int $error, string $error_str = '' ){
		return self::main( $error, $error_str, 'notic' );
	}
	
	/**
	 * 上报错误，级别：普通返回
	 * @param null|int $error 错误码
	 * @param mixed $error_str 错误的说明
	 * @return mixed $error 原样返回参数
	 */
	public static function return( int $error, string $error_str = '' ){
		return self::main( $error, $error_str, 'return' );
	}

}